#ifndef EFFETBASE_H
#define EFFETBASE_H

#include "Materiau.hpp"

#include <vector>
#include <boost/assign/list_of.hpp> 

/**
 * Classe de base pour tous les matériaux mélangeant 2 couleurs (ou
 * plus) en utilisant du bruit de type Perlin.
 *
 * En plus du conteneur de Couleur, la classe possède un conteneur de
 * seuils (à voir si on garde...) et un coefficient, qui permet
 * d'obtenir le même motif pour différentes tailles d'objets.
 *
 * @author Johan "Solo" Luisier
 *
 * @date 2010
 */
class EffetBase : public Materiau
{
 public:
  EffetBase(const double& refl = 0., const double& trans = 0.,
	    const double& indice = 1., const double& reg = 0.,
	    const std::vector< Couleur >& couleurs =
	    boost::assign::list_of( Couleur( 0, 0, 0 ) )
	    ( Couleur( 60, 60, 60 ) )( Couleur( 12, 120, 120 ) )
	    ( Couleur( 255, 255, 255 ) ),
	    const std::vector< double >& mel =
	    boost::assign::list_of( 0. )( .25 )( .5 )( 1. ),
	    const double& coeff = 1.);
  EffetBase(const double& refl, const double& trans, const double& indice,
	    const double& reg, const double& bruit,
	    const std::vector< Couleur >& couleurs,
	    const std::vector< double >& mel, const double& coeff);
  virtual ~EffetBase();
  /**
   * Méthode servant à renvoyer la valeur du bruit de Perlin pour le
   * point considéré.
   *
   * @param pt point pour lequel on veut obtenir la valeur du bruit.
   * @return la valeur du bruit pour le point pt.
   */
  virtual double valeurBruit(const Coord& pt) const = 0;
 protected:
  /**
   * Liste des Couleurs utilisables pour les mélanges à faire.
   */
  std::vector< Couleur > Colors;
  /**
   * Liste des poids ou des seuils à utiliser pour obtenir la Couleur
   * finale.
   */
  std::vector< double > Melange;
  /**
   * Coefficient multiplicatif, permettant d'intensifier ou diminuer
   * l'importance du bruit (et donc du caractère aléatoire) de la
   * variation de couleur.
   */
  double Coefficient;
};

#endif // EFFETBASE_H
